package com.day240701.filter;

import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//@WebFilter(filterName = "VisitStudentFilter", value = "/student/*")
public class VisitStudentFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        System.out.println("学生访问过滤器...");
        // 把两个参数 进行 “向下转型” ServletRequest ServletResponse 好多方法没有，只能通过转型，得到它的子类
        HttpServletRequest hsRequest = (HttpServletRequest) request;
        HttpServletResponse hsResponse = (HttpServletResponse) response;
        // 获得请求路径
        String uri = hsRequest.getRequestURI();

        System.out.println("URI:" + uri);
        // 判断 路径 后缀是否为 login.jsp
        if (uri.endsWith("login.jsp")) {
            // 如果后缀是 login.jsp 就放行
            chain.doFilter(request, response); // 放行，让它去下一个目的地
            return; // 防止后面再执行后续代码
        }
        // 再次判断一下，如果请求参数 op 值为 login，说明它准备去登录，也要放行
        String op = hsRequest.getParameter("op");
        if ("login".equals(op) || "isSNoExist".equals(op)) { // 记得 如果有涉及到 未登录前还要 做访问，记得放行（白名单）
            chain.doFilter(request, response);
            return;
        }
        // 其他的请求（路径带 student）都要进行权限控制（判断是否 session 中有 sNo，有则说明已登录状态）
        HttpSession session = hsRequest.getSession();
        Integer sNo = (Integer) session.getAttribute("sNo");
        if (sNo != null) {
            // 有登录过，继续前进
            chain.doFilter(request, response);
        } else {
            session.setAttribute("msg", "请先登录后，再访问！");
//            hsResponse.sendRedirect("login.jsp");
            String basePath = "http://" + hsRequest.getServerName() + ":" + hsRequest.getLocalPort() + hsRequest.getContextPath() + "/";
            // 使用绝对路径
            hsResponse.sendRedirect(basePath + "student/login.jsp");
        }

    }
}
